//
// Created by Administrator on 2025/9/3.
//

#include "modbusrtu_task.h"
#include "FreeRTOS.h"
#include "task.h"
#include "printf_rtos.h"
#include "nanomodbus_config.h"
#include "sensor_manager.h"
#include "queue.h"
extern nmbs_t g_nmbs;
extern uint16_t g_modbus_holding_regs[32];
extern uint16_t g_modbus_coil_regs[32];
void modbus_master_task(void* args) {
    UNUSED(args);
    // 1. 初始化 Modbus 客户端
    nmbs_client_init(&g_nmbs);
    // nmbs_set_read_timeout(&g_nmbs, 3000); // 设置1秒的响应超时

    for (;;) {
        // 2. 设置目标从站地址 (例如: 地址为 1 的从站)
        nmbs_set_destination_rtu_address(&g_nmbs, 0x01);

        // 3. 发送读保持寄存器请求 (FC03)
        // 从地址 0 开始，读取 10 个寄存器，存入 regs_test 数组
        nmbs_error status = nmbs_read_holding_registers(&g_nmbs, 0, 1, g_modbus_holding_regs);

        // 4. 检查结果
        if (status == NMBS_ERROR_NONE) {
            // 读取成功，可以在这里处理 regs_test 数组中的数据
            printf_rtos("Read success: regs[0]=%d\n", g_modbus_holding_regs[0]);
        }
        else {
            // 发生错误，可以根据 status 的值进行处理
            printf_rtos("Modbus error: %s\n", nmbs_strerror(status));
        }

        // 延时一段时间再进行下一次轮询
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

extern QueueHandle_t rtu_rx_q;
BaseType_t modbus_holding_regs_validate(uint8_t slave_addr,uint8_t start_addr,uint8_t reg_num,sensor_decode_formula_t formula, sensor_value_t *regs)
{
    // Manually flush the RX queue to discard any stale data from previous transactions
    xQueueReset(rtu_rx_q);

    nmbs_set_destination_rtu_address(&g_nmbs, slave_addr);
    nmbs_error status = nmbs_read_holding_registers(&g_nmbs, start_addr, reg_num, g_modbus_holding_regs);
    switch (formula)
    {
        case FORMULA_TEMP:
            *(float *)regs=g_modbus_holding_regs[0]*0.1f;
            break;
        case FORMULA_HUMI:
            *(float *)regs=g_modbus_holding_regs[0]*0.1f;
            break;
        case FORMULA_AIO:
            *(int *)regs=g_modbus_holding_regs[0];
            break;
        case FORMULA_AIO_AIR_P:
            *(float *)regs=g_modbus_holding_regs[0]*0.1f;
            break;
        default:
            status = NMBS_ERROR_INVALID_ARGUMENT;
            break;
    }

    vTaskDelay(20);
    return (status == NMBS_ERROR_NONE) ? pdPASS : pdFAIL;

}

BaseType_t modbus_coil_reg_write_single(uint8_t slave_addr,uint8_t start_addr,sensor_value_t value)
{
    nmbs_set_destination_rtu_address(&g_nmbs, slave_addr);
    nmbs_error err = nmbs_write_single_coil(&g_nmbs, start_addr, (bool)value.val_int);
    if (err!= NMBS_ERROR_NONE)
    {
        return pdFAIL;
    }
    return pdTRUE;
}
